'''
字符串压缩。利用字符重复出现的次数，编写一种方法，实现基本的字符串压缩功能。
比如，字符串aabcccccaaa会变为a2b1c5a3。
若“压缩”后的字符串没有变短，则返回原先的字符串。你可以假设字符串中只包含大小写英文字母（a至z）。

示例 1：
输入："aabcccccaaa"
输出："a2b1c5a3"

示例 2：
输入："abbccd"
输出："abbccd"
解释："abbccd"压缩后为"a1b2c2d1"，比原字符串长度更长。

提示：字符串长度在 [0, 50000] 范围内。

'''

class solution:
    def compress_string(self,s: str) -> str:
        # 处理空字符串情况
        if not s:
            return s
        # 初始化结果列表，使用列表效率高于字符串拼接
        result = []
        # 记录当前字符和出现次数
        current_char = s[0]
        count = 1
        # 遍历字符串，从第二个字符开始
        for char in s[1:]:
            if char == current_char:
                # 字符相同则计数加1
                count += 1
            else:
                # 字符不同则将之前的字符和计数加入结果
                result.append(current_char)
                result.append(str(count))
                # 更新当前字符和计数
                current_char = char
                count = 1

        # 处理最后一组字符  因为最后一组 只在内存中记录了(current_char和count变量值) 但是没有加入到result中
        result.append(current_char)
        result.append(str(count))
        # 拼接结果并与原字符串比较长度
        compressed = ''.join(result)
        return compressed if len(compressed) < len(s) else s


# 测试示例
if __name__ == "__main__":
    test_cases = [
        "aabcccccaaa",  # 预期输出: "a2b1c5a3"
        "abbccd",  # 预期输出: "abbccd" 因为压缩后并没有变短
        "",  # 预期输出: ""
        "a",  # 预期输出: "a" 因为压缩后并没有变短
        "aaaaa"  # 预期输出: "a5"
    ]
    solu = solution()
    for case in test_cases:
        print(f"输入: {case}")
        print(f"输出: {solu.compress_string(case)}")
        print("-" * 30)


